package com.jrauto.CarAppBackend.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.jrauto.CarAppBackend.entity.dto.LoginRequest;
import com.jrauto.CarAppBackend.entity.dto.RegisterRequest;
import com.jrauto.CarAppBackend.entity.User;
import com.jrauto.CarAppBackend.entity.dto.BindPhoneDTO;
import com.jrauto.CarAppBackend.entity.vo.LoginVO;

/**
 * @author huimin
 * @description 针对表【users】的数据库操作Service
 * @createDate 2025-06-25 11:01:18
 * 用户业务逻辑接口
 */
public interface UserService extends IService<User> {

    /**
     * 用户注册
     * @param request 注册请求 DTO
     * @return 注册成功的用户对象 (通常不返回密码)
     */
    User registerUser(RegisterRequest request);


    /**
     * 用户登录
     * @param request 登录请求 DTO (包含手机号和密码)
     * @return 登录成功后的 JWT Token
     */
    String login(LoginRequest request);


    /**
     * 微信用户手机号登录
     * @return
     */
    LoginVO wechatLoginPhone(String code1, String code2);

    /**
     * 微信登录业务逻辑
     * 根据微信code获取openid，然后判断用户是否存在。
     * 如果存在则直接登录并返回用户信息和JWT Token。
     * 如果不存在则注册新用户（随机昵称，保存openid），然后登录并返回用户信息和JWT Token。
     * @param code 微信小程序登录凭证
     * @return 包含JWT Token和用户信息的响应DTO
     */
    LoginVO wechatLogin(String code);


    /**
     * 用户登录，微信一键登录
     * @param openid
     * @return
     */
//    User login(String openid);

    /**
     * 获取微信openid
     * @param code
     * @return
     */
    String getOpenid(String code);


    /**
     * 根据手机号查询用户
     *
     * @param phone 手机号
     * @return 用户对象
     */
    User findUserByPhone(String phone);

    /**
     * 根据OpenID查询用户
     * @param openid 微信OpenID
     * @return 用户对象
     */
    User findUserByOpenid(String openid); // 新增公共方法

    /**
     * 根据用户标识（手机号或OpenID）查询用户
     * @param identifier 用户标识字符串
     * @return 用户对象
     */
    User findUserByIdentifier(String identifier); // 新增方法

// loadUserByUsername 方法现在会在 UserServiceImpl 中实现，因为 UserService 继承了 UserDetailsService

    /**
     * 修改用户密码
     * @param userId 当前用户ID
     * @param password 包含旧密码和新密码的请求DTO
     */
    void changePassword(Integer userId, String password);

    /**
     * 绑定手机号
     * @param userId 当前用户ID
     * @param request 包含要绑定手机号的请求DTO
     */
    void bindPhone(Integer userId, BindPhoneDTO request);

    /**
     * 解绑手机号
     * @param userId 当前用户ID
     */
    void unbindPhone(Integer userId);

    /**
     * 绑定微信OpenID
     * @param userId 当前用户ID
     * @param code 包含微信code的请求DTO
     */
    void bindWechat(Integer userId, String code);

    /**
     * 修改用户昵称
     * @param userId 当前用户ID
     * @param nickname 包含新昵称的请求DTO
     */
    void changeNickname(Integer userId, String nickname);

    /**
     * 修改用户头像
     * @param userId 当前用户ID
     * @param avatarUrl 包含新昵称的请求DTO
     */
    void updateUserAvatar(Integer userId, String avatarUrl);

}
